import { createModel } from '@rematch/core';
import { IAppStoreModels } from '@/store';
import { IUserState } from './typings';
import { encrypt } from '@/utils/encrypt';
import request from '@/request';

const defaultState: IUserState = {
  isLogin: false,
  name: '',
  authority: '',
  id: -1,
  userId: '',
  phone: '',
  password: '',
  type: -1,
};
export default createModel<IAppStoreModels>()({
  //模型的初始状态
  state: defaultState,
  //用于更新状态的同步函数，使用dispatch会被执行（Reducers 接受当前的状态和一个 action，然后返回一个新的状态）
  reducers: {
    update(state: IUserState, payload: Partial<IUserState>): IUserState {
      return { ...state, ...payload };
    },

    reset(state: IUserState, payload?: Partial<IUserState>) {
      return {
        ...defaultState,
        ...payload,
      };
    },
  },
  //接收一个 dispatch 函数作为参数。dispatch 是 Redux 中用于发送 action 到 store 的函数
  //异步的副作用函数
  effects: (dispatch) => ({
    async login(params) {
      const res = await request.basic.login(params.username, encrypt(params.password).toString(), params.token);
      return res;
    },
    async logout() {
      await request.basic.logout();
      dispatch.user.reset();//在用户登出之后，这行代码使用 dispatch 函数发送一个 action 来重置用户的状态
    },
  }),
});
//异步操作是指在执行过程中不会立即得到结果，而是需要等待某些外部事件（如网络响应、定时器触发、用户输入等）发生后才能继续执行的操作。
//在 JavaScript 中，这通常通过使用 Promise 对象、async/await 语法或回调函数来实现。
//同步：

// 任务按照顺序执行，当前任务未完成前，后续任务会等待。
// 执行完一个任务后再执行下一个任务，即调用者会等待被调用者返回结果后才继续执行。
// 异步：

// 任务可以并发执行，当前任务未完成时，可以启动其他任务。
// 调用者不会立即等待被调用者的结果，而是继续执行其他操作，被调用者的结果可以在稍后通过回调、事件、promise等方式处理。